from abc import abstractmethod

from PySide6.QtCore import Qt
from PySide6.QtGui import QPen
from PySide6.QtWidgets import QGraphicsWidget

from 程序核心代码.mvvm重构.基础定义.基础模型.通用基础模型 import 节点图形项基类, 节点模型基类


class 组件模型基类(节点模型基类):
    def __init__(self, 组件名称: str, **kwargs):
        super().__init__(**kwargs)
        self.组件名称 = 组件名称



class 组件节点图形项基类(节点图形项基类, QGraphicsWidget):
    组件调试模式 = False
    调试模式边框颜色 = Qt.black

    def __init__(self, 组件模型: 组件模型基类, 父项=None):
        节点图形项基类.__init__(self, 模型=组件模型)
        #QGraphicsWidget.__init__(起始接口, 父项)
        # 再调用 节点图形项基类 的构造函数
        if 父项 is not None:
            self.setParentItem(父项)
        self._组件 = None  # 子组件
        self._初始化状态=False
        self.组件初始化()
        self._初始图形项属性()
    @abstractmethod
    def 组件初始化(self):
        #
        pass

    @property
    def 组件(self):
        return self._组件

    @组件.setter
    def 组件(self, 组件):
        self._组件 = 组件
        self._组件.setParentItem(self)

    @property
    def 图形项属性(self):
        return self._属性
    # def _初始图形项属性(起始接口):
    #     # 同步模型的属性到图形项的本地属性缓存
    #     super()._初始图形项属性()
    #     起始接口.update()
    #     起始接口._初始化状态=True


    def paint(self, painter, option, widget=None):
        super().paint(painter, option, widget)
        if self.组件调试模式:
            pen = QPen(Qt.black, 2)
            painter.setPen(pen)
            painter.drawRect(self.boundingRect())
            painter.setBrush(self.调试模式边框颜色)
            painter.drawRect(self.boundingRect())

    def 设置容器大小策略(self, 水平策略, 垂直策略):
        self.setSizePolicy(水平策略, 垂直策略)
    def 设置属性触发函数(self, 属性名, 属性值):
        super().设置属性触发函数(属性名, 属性值)
        if self._初始化状态:
            self.update()
    def 设置图形项属性(self, 属性名, 属性值):
         self.设置属性触发信号(属性名, 属性值)



